/*
if
switch
goto
label
for
for range
所有的控制语句不需要()括起来
所有的控制语句大括号需要紧挨着语句写挨着条件
goto label: break continue
*/

package main

import "fmt"

// if
func ifc() {

	a := 1
	if a > 1 {

	} else if a > 2 {

	} else {

	}

	if i := 1; i == 1 {
		fmt.Print("ok")
	}
	// 区别 上面的a作用域于整个函数
	// 下面的i作用域整个if
	// 如果访问作用域外的变量就是undefined

	fmt.Print("if")
}

// for
func forc() {
	for i := 0; i < 10; i++ {
		fmt.Print(i)
	}
	a := 0
	for ; a < 10; a++ {
		fmt.Print(a)
	}
	a = 0
	for ; ; a++ {
		if a > 10 {
			break
		}
		fmt.Print(a)
	}
	a = 0
	for a < 10 {
		fmt.Print(a, "->")
		a++
	}
	for {
		// 没有条件死循环
		break
	}

	fmt.Print(123)
	fmt.Println("")
	for i := 1; i < 10; i++ {
		for j := 1; j <= i; j++ {
			fmt.Printf("%d*%d=%d ", j, i, i*j)
		}
		fmt.Println("")
	}
}

// for range
// 遍历 数组、切片、map、channel、中文等
func forr() {
	// 举例
	// str := "admin丁陆超"
	// for i, v := range str {
	// 	fmt.Println(i, v)
	// }
}

// switch
func switchc() {
	// break 建议加上虽然省略没啥问题统一
	// a := 1
	// switch a {
	// case 1:
	// 	fmt.Println("11111")
	// default:
	// 	fmt.Println("df")
	// }

	// switch a:=1;a{

	// }

	// a := 1
	// switch a {
	// case 1:
	// 	fmt.Println("11111")
	// 	fallthrough // 不管下面条件如何直接穿透 这break不写就是break 穿透必须用fallthrough 并且下面的条件直接忽略,想穿透就找fallthrough 只能穿透一层只能穿透相邻的 多个穿透多个fallthrough
	// case 2:
	// 	fmt.Println("22222")
	// default:
	// 	fmt.Println("df")
	// }

	// a := 1
	// switch {
	// case a >= 1:
	// 	fmt.Println("11111")
	// case a > 2:
	// 	fmt.Println("22222")
	// default:
	// 	fmt.Println("df")
	// }

	// 类型断言
	// var a interface{} = 1
	// switch a.(type) {
	// case int:
	// 	fmt.Println("int")
	// default:
	// 	fmt.Println("def")
	// }

	// a 1或者2都能进去
	// switch a := 2; a {
	// case 1, 2:
	// 	fmt.Println("1,2")
	// default:
	// 	fmt.Println("df")
	// }

}

// other goto label: break continue
func other() {
	// label名字随意写
mqx:
	for i := 1; i < 10; i++ {
		for j := 1; j < i; j++ {
			fmt.Println(i, j)
			if j == 4 {
				break mqx
			}
		}
	}

	// contine
	// contine mqx

	// goto 4 5直接跳过
	fmt.Println(1)
	fmt.Println(2)
	fmt.Println(3)
	goto gt
	fmt.Println(4)
	fmt.Println(5)
gt:
	func() {
		fmt.Println("md")
	}()

}

func main() {
	// if
	// ifc()

	// for
	// forc()

	// for range
	// forr()

	// switchc
	//switchc()

	// other goto label: break continue
	other()
}
